package com.mybank.dao.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.ContextConfiguration;
import org.junit.runner.RunWith;
import org.springframework.transaction.annotation.Transactional;
import com.mybank.domain.Cuenta;
import com.mybank.bo.exception.CuentaNula;
import com.mybank.dao.impl.CuentaDaoImpl;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author mjcali
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
    "/mybank-db.xml",
    "/mybank-dao.xml",
    "/mybank-hibernate.xml"
})
@Transactional
public class CuentaDaoComponenteTest {

    /** La instancia bajo test.
     *  La anotación @Autowired hará que Spring la inyecte automáticamente
     */
    @Autowired
    private CuentaDaoImpl instance;

    @Test
    public void buscarCuenta_CuentaExistente_retornaCuenta() throws CuentaNula {

        Cuenta cuenta = instance.buscarCuenta("4");
        assertNotNull(cuenta);

        assertEquals(cuenta.getSaldo(), 98500f, 0);
        assertEquals(cuenta.getSobregiro(), 0, 0);
        assertEquals(cuenta.getTipoCuenta(), "ca");
    }

    @Test
    public void buscarCuenta_CuentaInexistente_retornaCuentaNula() throws CuentaNula {

        Cuenta cuenta = instance.buscarCuenta("17");
        assertNull(cuenta);
    }

    @Test(expected = IllegalArgumentException.class)
    public void buscarCuenta_CuentaInexistente_lanzaCuentaNula() throws CuentaNula {

        Cuenta cuenta = instance.buscarCuenta(null);
        fail("debería haber lanzado IllegalArgumentException ");
    }

    @Test
    public void depositar_MontoOk_efectuaDeposito() {

        instance.depositar(300);
    }
}
